package com.jscloud.bigdata.hive.udf;

import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;

/**
 * 自定义一个 UDF函数，实现计算给定字符串的长度。
 */
public class HiveUDF  extends GenericUDF {


        @Override
        public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {
                // 判断输入参数的个数
                if (arguments.length != 1) {
                        throw new UDFArgumentException("输入参数长度异常,只允许输入1个参数");
                }
                // 判断输入参数的类型(是否是基本类型)
                // Category 共定义了5种类型：基本类型(Primitive)，集合(List)，键值对映射(Map)，结构体(Struct)，联合体(Union)
                if(!arguments[0].getCategory().equals(ObjectInspector.Category.PRIMITIVE)){
                        throw new UDFArgumentTypeException(0,"输入参数类型异常");
                }
                // 函数本身返回值为 int，需要返回 int 类型的鉴别器对象
                return PrimitiveObjectInspectorFactory.javaIntObjectInspector;
        }

        @Override
        public Object evaluate(DeferredObject[] arguments) throws HiveException {
                if (arguments[0].get() == null) {
                        return 0;
                } else {
                        return arguments[0].get().toString().length();
                }
        }

        @Override
        public String getDisplayString(String[] strings) {
                return null;
        }
}
